package com.atguigu.utils;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author:GaoFei
 * @Description:
 * @Date:Created in 18:11
 * @Modified By:
 */
public class ThreadPoolUtil {
    private ThreadPoolUtil() {
    }

    private static ThreadPoolExecutor poolExecutor = null;

    public static ThreadPoolExecutor getThreadPool() {
        /**
         * 线程池的七大参数：
         *     1、 corePoolSize(int):核心线程数【一直存在除非(allowCoreThreadTimeOut)】；
         *     线程池创建好以后就准备就绪的线程数量，就等待来接受异步任务去执行。
         *     2、 maximumPoolSize(int): 最大的线程数量，控制资源
         *     3、 keepAliveTime：存活时间。如果当前的线程数量大于core数量，就释放空闲【执行完任务的线程】的线程。
         *      过了keepAliveTime长时间还没有来任务就释放线程。
         *     4、unit：时间单位
         *     5、BlockingQueue<Runnable> workQueue:阻塞队列，如果任务有很多，就会将目前多的任务放在队列里面，只要有线程空闲
         *     ，就会去队列里面取出新的任务继续运行
         *     6、threadFactory:线程的创建工厂
         *     7、handler：如果队列满了，按照我们指定的拒绝策略拒绝执行任务。
         */
        if (poolExecutor == null) {
            synchronized (ThreadPoolUtil.class) {
                if (poolExecutor == null) {
                    poolExecutor = new ThreadPoolExecutor(
                            // 七大参数
                            4,
                            8,
                            1L,
                            // 默认Interger最大值 内存受不了
                            TimeUnit.MINUTES,
                            new LinkedBlockingDeque<>(10000),
                            Executors.defaultThreadFactory(),
                            // 默认线程池拒绝策略会抛出异常，使用这个拒绝时会拒绝任务直接抛弃
                            new ThreadPoolExecutor.DiscardPolicy()
                    );
                }
            }
        }
        return poolExecutor;
    }
}
